'''
多任务版tcp服务器

1. 循环等待接收客户端的连接请求
2. 客户端和服务器连接成功
    a.给每个客户端初始化一个套接字：socket
    b.给每一个客户端创建一个线程（守护线程）
    c.每个线程独立处理客户端收发数据
'''

# 初始化tcp服务器socket
import socket
import threading

_buffer = 2048

def handle_client(tcp_client_socket:socket.socket, client_addr:socket.socket):
    thread_name = threading.current_thread.__name__
    server_variable = f"欢迎来到【赵留刚】的服务器:{thread_name}"
    tcp_client_socket.send(server_variable.encode(encoding="utf-8"))
    while True:
            # 接收客户端发送的数据
            client_data = tcp_client_socket.recv(_buffer)
            # 进行数据处理
            if client_data:
                # 对接收到的客户端数据进行解码处理
                try:
                    client_decode_data = client_data.decode(encoding="utf-8")
                except Exception as e:
                    client_decode_data = client_data.decode(encoding="GBK")
                # 数据解码完成，将解码完成的数据打印出来
                print(f"服务器接收的客户端{client_addr}数据为：{client_data}")
                tcp_client_socket.send("服务器已收到数据\n".encode(encoding="utf-8"))
            else:
                # 接收到空字节，说明客户端已经断开
                print(f"客户端{client_addr}已断开")
                tcp_client_socket.close()
                break
            
if __name__ == '__main__':
    # 创建socket TCP 服务器
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 绑定IP和端口号
    port = 8888
    addr = ("", port)
    tcp_server_socket.bind(addr)
    # 将socket设置为被动监听（被动模式），128表示最大接入服务器的客户端数量
    tcp_server_socket.listen(128)
    
    print("------服务器已启动------", port)
    
    while True:
        # 允许客户端接入，不断阻塞，等待新的客户端接入
        (tcp_client_socket, client_addr) = tcp_server_socket.accept()
        # 有新的客户端接入
        print(f"有新的客户端{client_addr}接入")
        
        # 创建线程
        thread = threading.Thread(target=handle_client, args=(tcp_client_socket, client_addr))
        # 创建保护线程
        thread.daemon = True
        # 开启线程
        thread.start()
        
    tcp_server_socket.close()
                    